home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 301-325 / disk_313 / uucp / uucp1.lzh / src / sendmail / domain.c < prev    next >
C/C++ Source or Header  |  1990-01-25  |  4KB  |  192 lines

  1.  
  2. /*
  3.  *  DOMAIN.C
  4.  *
  5.  *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
  6.  *
  7.  *  Given the first machine in a path scan the domain list and
  8.  *  return the type, class, and address of the resource entry.
  9.  *
  10.  *  AUTOMATIC HACKS:    scans L.sys file and automatically deals
  11.  *            with machine[.UUCP] domain, returning
  12.  *            Type=MD Class=UU Addr=machine.UUCP
  13.  */
  14.  
  15. #include <proto/all.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18.  
  19. extern char *DefaultNode;
  20.  
  21. DomainLookup(name, len, tb, cb, ab)
  22. char *name;
  23. char *tb;
  24. char *cb;
  25. char *ab;
  26. {
  27.     char *dary[16];
  28.     char *tmp = malloc(len + 1);
  29.     char *tbase = tmp;
  30.     short b, i;
  31.     short di;
  32.     FILE *fi;
  33.     short level;        /*    best domain level found so far */
  34.     static char buf[256];
  35.  
  36.     for (b = i = di = 0; i < len && name[i] != '!'; ++i) {
  37.     if (name[i] == '.') {
  38.         if (di == sizeof(dary)/sizeof(dary[0]) - 1) {
  39.         ulog(-1, "DomainLookup, too many domains! %s", name);
  40.         break;
  41.         }
  42.         strncpy(tmp, name + b, i - b);
  43.         tmp[i - b] = 0;
  44.         dary[di] = tmp;
  45.         tmp += i - b + 1;
  46.         b = i + 1;
  47.         ++di;
  48.     }
  49.     }
  50.     strncpy(tmp, name + b, i - b);
  51.     tmp[i - b] = 0;
  52.     dary[di++] = tmp;
  53.  
  54. #ifdef NOTDEF
  55.     {
  56.     short i;
  57.     for (i = 0; i < di; ++i)
  58.         printf("XX '%s'\n", dary[i]);
  59.     }
  60. #endif
  61.  
  62.     fi = fopen("UULIB:Domain", "r");
  63.     level = 0;
  64.     if (fi) {
  65.     while (fgets(buf, sizeof(buf), fi)) {
  66.         short l2;
  67.         short di2 = 0;
  68.         char *dary2[16];
  69.  
  70.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#')
  71.         continue;
  72.         for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i) {
  73.         if (buf[i] == '.') {
  74.             if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1) {
  75.             ulog(-1, "UULIB:Domain, entry has too many subdomains: %s", buf);
  76.             break;
  77.             }
  78.             dary2[di2++] = buf + b;
  79.             buf[i] = 0;
  80.             b = i + 1;
  81.         }
  82.         }
  83.         buf[i] = 0;
  84.         dary2[di2++] = buf + b;
  85.  
  86.         buf[i] = 0;     /*  get domain name/wildcard        */
  87.  
  88.         l2 = CompareDomain(dary, di, dary2, di2);
  89.  
  90. #ifdef NOTDEF
  91.         {
  92.         short i;
  93.         printf("\nres %d\n", l2);
  94.         for (i = 0; i < di; ++i)
  95.             printf("#1 %s\n", dary[i]);
  96.         for (i = 0; i < di2; ++i)
  97.             printf("#2 %s\n", dary2[i]);
  98.         }
  99. #endif
  100.  
  101.         if (l2 > level) {   /*  better domain then what we have     */
  102.         sscanf(buf + i + 1, "%s %s %s", tb, cb, ab);
  103.         level = l2;
  104.         }
  105.     }
  106.     fclose(fi);
  107.     }
  108.  
  109.     /*
  110.      *    Couldn't find the appropriate domain entry, check L.sys
  111.      *    OR domain entry is a forwarder, check L.sys
  112.      */
  113.  
  114.     if (strcmp(tb, "MF") == 0 || level == 0) {
  115.     if (fi = fopen("UULIB:L.sys", "r")) {
  116.         while (fgets(buf, sizeof(buf), fi)) {
  117.         if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '#' || buf[0] == '\n')
  118.             continue;
  119.         for (i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i);
  120.         buf[i] = 0;
  121.         if (strcmpi(dary[0], buf) == 0) {
  122.             strcpy(tb, "MD");
  123.             strcpy(cb, "UU");
  124.             strcpy(ab, buf);
  125.             strcat(ab, ".UUCP");
  126.             level = 1;
  127.             break;
  128.         }
  129.         }
  130.         fclose(fi);
  131.     }
  132.     }
  133.  
  134.     /*
  135.      *    Couldn't find nothing, use DefaultNode
  136.      */
  137.  
  138.     if (level == 0) {
  139.     ulog(-1, "Warning, unable to interpret addr %s, using DefaultNode", name);
  140.     if (DefaultNode == NULL) {
  141.         ulog(-1, "Error, DefaultNode must exist if no UULIB:Domain");
  142.         printf("ERROR, no entry in UULIB:Domain, UULIB:L.sys, and\n");
  143.         printf("no DefaultNode config entry for %s\n", name);
  144.         puts("cannot send mail");
  145.         free(tbase);
  146.         return(0);
  147.     }
  148.     strcpy(tb, "MF");
  149.     strcpy(cb, "UU");
  150.     strcpy(ab, DefaultNode);
  151.     level = 1;
  152.     }
  153.     free(tbase);
  154.     return(level > 0);
  155. }
  156.  
  157. /*
  158.  *  Compares a broken up address with a domain entry (buf).
  159.  */
  160.  
  161. CompareDomain(da1, di1, da2, di2)
  162. char **da1;
  163. short di1;
  164. char **da2;
  165. short di2;
  166. {
  167.     short i, j;
  168.     short level = 0;
  169.  
  170.     for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j) {
  171.     if (da2[j][0] == '*') {
  172.         ++level;
  173.         if (i && j == 0)    /*  so loop does not terminate  */
  174.         ++j;
  175.         continue;
  176.     }
  177.     if (strcmpi(da1[i], da2[j]) == 0)
  178.         level += 2;
  179.     else {
  180.         if (j + 1 < di2 && da2[j+1][0] == '*') {
  181.         ++level;
  182.         ++j;
  183.         } else
  184.         return(0);
  185.     }
  186.     }
  187.     if (j >= 0)         /*  didn't exhaust domain entry */
  188.     return(0);
  189.     return((int)level);
  190. }
  191.  
  192.